#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QDate>
#include <QMenuBar>
#include <QToolBar>
#include <QStatusBar>
#include <QLabel>
#include <QAction>
#include <QDebug>
#include <QTableView>
#include <QTreeView>
#include <QPushButton>
#include <QHBoxLayout>
#include <QVBoxLayout>
#include <QStandardItemModel>
#include <QRandomGenerator>
#include <QTcpServer>
#include <QTcpSocket>
#include <QPlainTextEdit>
#include <QTimer>
#include <QMessageBox>
#include <QVBoxLayout>
#include <QFileDialog>
#include <QThread>
#include <QSqlDatabase>
#include <QSqlQuery>
#include <QSqlError>

QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

private slots:
    void openNewPage();  //打开新页面
    void reverseTable();  //倒序
    void processTreeData();  //把<=25的数据变成0
    void filterTreeRows();  //过滤出单数行

    void toggleCommunication();  //点击通信
    void handleNewConnection();  //处理新连接
    void handleServerReadyRead();   //服务器读取
    void handleClientConnected();   //客户端连接
    void handleClientReadyRead();   //客户端读取
    void handleSocketError(QAbstractSocket::SocketError error);  //处理套接字错误
    void sendClientData();          //发送客户端数据

    void selectAndWrite();  //选择和写入
    void handleProgress(int value);  //写入进度
    void handleFinished();  //写完

    void createTable();    //创建数据表并插入数据建表
    void sortData();       //按随机数2降序排序
    void processOddRows(); //处理奇数行并删除偶数行

private:
    Ui::MainWindow *ui;

    void setupTable();      //创建表格
    void setupTreeView();   //创建树形图
    QStandardItemModel *tableModel;  //表格信息
    QStandardItemModel *treeModel;   //树信息
    QTreeView *treeView;            //树视图
    QTableView *tableView;          //表格视图

    void setupServer();         //设置服务器
    void setupClient();         //设置客户端
    QTcpServer *m_tcpServer;    //服务器
    QTcpSocket *m_serverSocket; //服务器套接字
    QTcpSocket *m_clientSocket; //客户端套接字
    QTimer *m_sendTimer;        //定时器
    QPlainTextEdit *m_textDisplay;  //文本显示
    QPushButton *m_controlButton;   //通信按钮
    int m_sendCounter = 1;
    const quint16 PORT = 12345;     //端口号

    QPushButton *m_button;   //写入文件按钮

    void initDB();              //初始化数据库
    void showError(const QSqlError &err);  //展示错误
    QPushButton *m_btnCreate;   //创建数据表并插入数据按钮
    QPushButton *m_btnSort;     //按随机数2降序排序按钮
    QPushButton *m_btnProcess;  //处理奇数行删除偶数行按钮
    QSqlDatabase m_db;          //数据库
};
#endif // MAINWINDOW_H
